package com.soecode.lyf.config;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

public class JWTUtils {
	/**
     * 公钥
     */
    private static String SECRET = "ZYB";  //此处随便设置一个自己的加密符号
    public static String createToken(String id) throws Exception {
        // 签发时间
        Date iatDate = new Date();
 
        // 过期时间，7天时间
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.HOUR, 24 * 8);
        Date experiesDate = nowTime.getTime();
 
        
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("alg", "HS256");
        map.put("typ", "JWT");
        String token = JWT.create()
                .withHeader(map)
                .withClaim("id", id)
                .withClaim("exp", experiesDate)
                .withExpiresAt(experiesDate) // 设置过期的日期
                .withIssuedAt(iatDate) // 签发时间
                .sign(Algorithm.HMAC256(SECRET)); // 加密
        return token;
    }
 
    /**
     * 解密
     */
 
    public static DecodedJWT verifyToken(String token) throws Exception {
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
        DecodedJWT jwt = null;
        try {
            jwt = verifier.verify(token);  //核实token
            //long exp = jwt.getExpiresAt();
        } catch (Exception e) {
            throw new Exception("登录过期");
        }
        return jwt;  //返回的是解析完的token，是一个map，里面有id
    }
	static boolean compare(String time1,String time2) throws ParseException{
		//如果想比较日期则写成"yyyy-MM-dd"就可以了
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		//将字符串形式的时间转化为Date类型的时间
		Date a=sdf.parse(time1);
		Date b=sdf.parse(time2);
		//Date类的一个方法，如果a早于b返回true，否则返回false
		if(a.before(b))
			return true;
		else
			return false;
		/*
		 * 如果你不喜欢用上面这个太流氓的方法，也可以根据将Date转换成毫秒
		if(a.getTime()-b.getTime()<0)
			return true;
		else
			return false;
		*/
	}
    public static void main(String[] arg) throws Exception{
    	String id = "dfsdfasfasdrerasdasd";
    	String token = createToken(id);
    	System.out.println("看看token"+token);
    	DecodedJWT login = verifyToken(token);
    	System.out.println("看看map"+login);
    	System.out.println("看看map"+login.getClaim("id").asString());
    	System.out.println("过期时间"+login.getExpiresAt());
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String exp = df.format(login.getExpiresAt());
    	System.out.println("转化后过期时间"+exp);
    	Date birthday2 = new Date();
    	String birthday1 = df.format(birthday2);
    	boolean a = compare(exp,birthday1); //如果exp早于birthday1返回true，否则返回false
    	System.out.println("早不早"+a);
    }
}
